# -*- coding: utf-8 -*-
""" Auteur: Anthony Vallée-Dubois """
#import Server
#import Client

""" La classe Sheet est la représentation d'un CRC.
    Il est donc possible de lui associer des responsabilités (actions) et des collaborateurs (attributes).
    Il est en plus possible de leur assigner à tous des méta-données.
    Collaborateurs:
        - les responsabilités
        - les collaborateurs
        - les méta-données
    Responsabilités: aucune (tout se fait par accès direct aux collaborateurs)
"""
class Sheet(object):
    
    def __init__(self, name = '', actions = [],attributes = [], metaData = [],id = None, version = None):
        self.name = name
        self.actions = actions
        self.attributes = attributes
        self.metaData = metaData
        self.version = version
        self.id = id

""" La classe Action représente une responsabilité de CRC.
    Collaborateurs:
        - son nom
        - ses arguments
        - ses méta-données
"""
class Action(object):
    
    def __init__(self, name = '', arguments = [],  metaData = [],version = None):
        self.id = None
        self.version = version
        self.arguments = arguments
        self.name = name
        self.metaData = metaData

""" La classe Attribute représente un collaborateur de CRC.
    Collaborateurs:
        - son nom
        - son type
        - ses méta-données
"""
class Attribute(object):
    
    def __init__(self, name = '', type = '', isArray = False, metaData = [],id = None, version = None):
        self.id = id
        self.version = version
        self.type = type
        self.name = name
        self.metaData = metaData
        self.isArray = isArray

""" La classe MetaData est assez explicite.
    La seule raison pour laquelle une classe a été créée pour elle est que l'architecture
    du serveur rend impossible de stocker un tableau de strings: il faut absolument
    des tableaux d'objets.
"""
class MetaData(object):
    
    def __init__(self, md, id = None):
        self.id = id
        self.md = md
    
    def __str__(self):
        return self.md

""" Cette fonction retourne la liste de CRC d'un projet à partir du client. """
def getSheetList(client):
    return client.server.getObjectsOfClass(Sheet)

Sheet.attrDefs = {"name": str, "actions": [Action], "attributes": [Attribute], "metaData": [MetaData], "id": int, "version": int}
Sheet.dependsOn = None

Action.attrDefs = {"name": str, "arguments": [Attribute], "metaData": [MetaData], "version": int, "id": int}
Action.dependsOn = [Sheet]

Attribute.attrDefs = {"name": str, "type": str, "isArray": bool, "metaData": [MetaData], "id": int, "version": int}
Attribute.dependsOn = [Sheet,Action]

MetaData.attrDefs = {"id": int, "md": str}
MetaData.dependsOn = [Sheet,Action,Attribute]